#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>

void showPending(sigset_t &pending);

// 信号自定义方法
void handler(int signo)
{
    std::cout << "this is handler " << "signo:" << signo << std::endl;
    int cnt = 5;
    while (cnt--)
    {
        // 打印pending表
        sigset_t pending;      // 创建信号集变量
        sigemptyset(&pending); // 初始化信号集变量
        sigpending(&pending);  // 获取pending信号未决表
        showPending(pending);  // 打印pending表
        sleep(1);
    }
}

// 打印pending表
void showPending(sigset_t &pending)
{
    for (size_t i = 31; i > 0; i--)
    {
        if (sigismember(&pending, i))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

//测试子进程退出会向父进程发送信号
int main()
{
    // signal(SIGCHLD, handler);//子进程退出后会产生SIGCHLD信号，执行handler
    signal(SIGCHLD, SIG_IGN);//子进程退出后不会存在僵尸状态，无需父进程回收

    //创建子进程
    if(fork() == 0)
    {
        //子进程
        std::cout << "child running" << std::endl;
        sleep(5);
        std::cout << "child exit" << std::endl;
        exit(1);
    }

    sleep(10);

    return 0;
}



// int main()
// {
//     // 调用sigaction接口
//     struct sigaction act, oact; // 创建两个act变量
//     sigemptyset(&act.sa_mask);  // 对屏蔽字进行初始化
//     sigemptyset(&oact.sa_mask);
//     act.sa_flags = 0;         // 初始化标志位
//     act.sa_handler = handler; // 自定义信号处理方式

//     sigaction(2, &act, &oact); // 将act定义的方法和信号2捆绑

//     while (true)
//     {

//         sleep(1);
//     }

//     return 0;
// }